import java.text.DecimalFormat;
import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * FerStack.java
 * Fecha: 19 de julio de 2011
 * Autor: Juan Fernando Medrano Yax, 10330
 * Descripcion: Esta clase permite crea un objeto tipo FerStack y este funciona como almacenamiento de distintos
 * valores para calcular una expresion postfix.
 */

/**
 * @author Medrano
 *
 */
public class DriverStack {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FerStack<Double> stack = new FerStack<Double>();
		double var=0,oper1,oper2,result;
		DecimalFormat formato = new DecimalFormat("###.###");
		int opcion=0;
		int opcion1=0;
		
		
		System.out.println("  ----- Bienvenido a la calculadora POSTFIX ----- ");
		System.out.println("  -- Para comenzar debe ingresar dos numeros : ");
		var=ingresar("Ingrese un numero: ", "Ingreso incorrecto!");
		stack.push(var);
		var=ingresar("Ingrese otro numero: ", "Ingreso incorrecto!");
		stack.push(var);
		//System.out.println(stack);
		
		do{
			Menu();
			opcion=(int)ingresar("Ingrese el numero de la opcion que desea realizar","No es una opcion valida");
			switch(opcion){
				case 1:		//Se desea ingresar un numero
					var=ingresar("Ingrese un numero: ","Ingreso incorrecto, intente otra vez.");
					stack.push(var);
					break;
				case 2:		//Se desea ingresar una operacion
					subMenu();
					opcion1=(int)ingresar("Ingrese el numero de la operacion que desea realizar","No es un ingreso valido");
					switch(opcion1){
						case 1: 		//Suma
							oper1=stack.pop();
							oper2=stack.pop();	
							result=oper2+oper1;
							stack.push(oper2);
							stack.push(oper1);
							stack.push(result);
							System.out.println("El resultado de la suma es: "+formato.format(result));
							break;
						case 2:			//Resta
							oper1=stack.pop();
							oper2=stack.pop();
							result=oper2 - oper1;
							stack.push(oper2);
							stack.push(oper1);
							stack.push(result);
							System.out.println("El resultado de la resta es: "+formato.format(result));
							break;
						case 3:			//Multiplicacion	
							oper1=stack.pop();
							oper2=stack.pop();
							result=oper2 * oper1;
							stack.push(oper2);
							stack.push(oper1);
							stack.push(result);
							System.out.println("El resultado de la multiplicacion es: "+formato.format(result));
							break;
						case 4:			//Division
							oper1=stack.pop();
							oper2=stack.pop();
							if(oper1!=0.0){
								result=oper2 / oper1;
								stack.push(oper2);
								stack.push(oper1);
								stack.push(result);
								System.out.println("El resultado de la division es: "+formato.format(result));
							}else{
								stack.push(oper2);
								stack.push(oper1);
								System.out.println(" --ERROR, Division entre cero");
							}
							break;
						default:		//Opcion incorrecta
								System.out.println("Dicha opcion no existe");
					}
					break;
				case 3:			//Ver Stack
					System.out.println("ADIOS!");
					opcion=4;
					break;
				default:
					System.out.println("Dicha opcion no existe");				
			}			
		}while(opcion!=4);
		
		

	}
	
	
	public static void Menu(){
		System.out.println("------------------------------------------------------");
		System.out.println("+	  Menu de Opciones                           +");
		System.out.println("+ 1.- Ingresar un numero                             +");
		System.out.println("+ 2.- Ingresar una operacion                         +");
		System.out.println("+ 3.- Salir del programa                             +");
		System.out.println("------------------------------------------------------");
	}
	
	public static void subMenu(){
		System.out.println("------------------------------------------------------");
		System.out.println("+	  Menu de Operaciones                          +");
		System.out.println("+ 1.- Sumar                                          +");
		System.out.println("+ 2.- Restar                 		                 +");
		System.out.println("+ 3.- Multiplicar                                    +");
		System.out.println("+ 4.- Dividr                                         +");
		System.out.println("------------------------------------------------------");		
	}
	
	/**
	 * Permite indicar al usuario a traves del parametro "texto" que se espera una entrada y mostrar el mensaje de error "error" si
	 * su entrada es clasificada como no valida.
	 * @param texto
	 * @param error
	 * @return double
	 */
	public static double ingresar(String texto, String error)
	{	
		Scanner input=new Scanner(System.in);
	
		double seleccion=-0.1;
		do{	
			System.out.println(texto);
			try
			{
				seleccion=input.nextDouble();
			}catch(InputMismatchException malo)
			{ 
				System.out.println(error);
			}
			input.nextLine(); // Ese Enter que siempre se queda ahi!!!
		}while(seleccion==-0.1); 
	return seleccion;
	}

}
